/** Fichier définissant la forme d'un cône infini.
 *
 * Ce fichier définit la classe BaseCone.
 *
 * @file BaseCone.hpp
 * @author Johan "Solo" Luisier
 *
 * @date 4 Juillet 2011
 */
#ifndef BASECONE_HPP
#define BASECONE_HPP

#include "FormeInfinie.hpp"

/** Classe définissant un cône infini.
 *
 * Cette classe permet de définir un cône infini : càd sans base. Pour l'instant
 * il n'est pas possible d'utiliser une telle forme dans une scène. Cette forme
 * sert à définir un cône comme l'intersection d'une instance de BaseCone et
 * d'un Plan.
 *
 * L'instance est définie par son sommet, son axe de symétrie et un
 * angle d'ouverture (qui est donné par sa tangente).
 *
 * @author Johan "Solo" Luisier
 *
 * @date 4 Juillet 2011
 *
 * @class BaseCone "BaseCone.hpp" "Formes/BaseCone.hpp"
 */
class BaseCone : public FormeInfinie
{
public:
    BaseCone();
    BaseCone( const Coord& pt, const VecteurU& axe, const double& ouverture );
    BaseCone( const BaseCone& baseCone );
    virtual ~BaseCone();

    Coord trouveIntersection( const Rayon & ) const;

    VecteurU normale( Coord const & ) const;

    bool estDans( Coord const & ) const;
    bool estSur( Coord const & ) const;

    void mapping( const Coord &pt, int &i, int &j, const int &frequence,
                  const int &Hauteur, const int &Largeur ) const;

    const VecteurU& axe() const;
    const Coord& sommet() const;
    const double& tanAlpha() const;

    std::ostream& affiche( std::ostream& os ) const;

    Coord intrinseque( const Coord& pt ) const;
protected:
    /**
     * Axe de rotation du cône.
     */
    VecteurU Axe;
    /**
     * Sommet du cône.
     */
    Coord Sommet;
    /**
     * Ouverture du cône.
     */
    double TanAlpha;
};

#endif // BASECONE_HPP
